package com.pubinfo.passbook.common.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.pubinfo.passbook.common.model.bo.witeoff.subitem.MedicineOnJobOrRetireSubitem;
import com.pubinfo.passbook.common.model.dto.open.WiteoffSubitemData;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 报账子单信息表
 *
 * @TableName t_witeoff_instance_subitem
 */
@TableName(value = "t_witeoff_instance_subitem")
@Data
@NoArgsConstructor
public class TWiteoffInstanceSubitem implements Serializable {
  /**
   *
   */
  @TableId
  private String id;
  
  /**
   *
   */
  private String otherSystemDetailId;
  
  /**
   * 用途编码	非必须	可由业务提供，经济事项存在用途时必填。  (在职及供属医药费)-U349 补充医疗特需资金  , (退休员工医药费) -U243, (环保费) U219 或U220  , (社会团体会费)-  U541
   */
  private String usageCode;
  
  /**
   * 经济事项存在用途时必填   (在职及供属医药费)-  补充医疗特需资金  , (退休员工医药费) -离退休人员体检费、医疗及供养亲属医药费, (环保费)  垃圾处理或 污水处理 , (社会团体会费)- 团体会费
   */
  private String usageName;
  
  /**
   * 列账属性	必须	选项：1-是：使用成本/资本预算，2-否：不使用成本/资本预算，3-否：不使用成本预算（统付），4-建管费  (在职及供属医药费) -  如果是在职 默认为2 供属默认为1,
   * (退休员工医药费) 、(环保费)、(社会团体会费)- 存续：默认2 上市：默认1
   */
  private Byte budgetType;
  
  /**
   * 子单金额
   */
  private BigDecimal sum;
  
  /**
   * 摘要
   */
  private String detail;
  
  /**
   * 预算指标编码	非必须	可以通过“获取预算指标模板”接口获取 (在职及供属医药费) - CW0230
   * (退休员工医药费)- CW1144、(环保费) -CW1145 、(社会团体会费)- CW1145
   */
  private String budgetItemCode;
  
  /**
   * 预算指标名称  (在职及供属医药费) - 职工福利
   * (退休员工医药费)- 离退休费用、(环保费) -其他 、(社会团体会费)- 其他
   */
  private String budgetItemName;
  
  /**
   * 活动预算编码	非必须	可以通过“获取活动预算”接口获取
   */
  private String budgetProjectCode;
  
  /**
   * 活动预算名称
   */
  private String budgetProjectName;
  
  /**
   * 预算责任中心编码	非必须	可以通过“获取下级预算组织” 接口获取
   */
  private String budgetOrgCode;
  
  /**
   * 预算责任中心名称
   */
  private String budgetOrgName;
  
  /**
   * ICT编码	非必须	可以通过“获取活动预算”接口获取
   */
  private String ictCode;
  
  /**
   * ICT名称	非必须	可以通过“获取活动预算”接口获取
   */
  private String ictName;
  
  /**
   * 会计科目编码	非必须	可从SAP获取基础数据
   */
  private String debitAccountCode;
  
  /**
   * 会计科目名称
   */
  private String debitAccountName;
  
  /**
   * 贷方科目编码	非必须	(税费计提时使用，当是税费计提时，借贷方都在子单
   */
  private String creditAccountCode;
  
  /**
   * 贷方科目名称
   */
  private String creditAccountName;
  
  /**
   * 贷方科目类型	非必须	税费时选输(1-总账、2-供应商、3-客户)，当存在科目时，科目类型必填
   */
  private Byte creditAccountType;
  
  /**
   * 借贷标识	非必须	选项：1-借，0-贷
   */
  private Byte isDebiisDebitCredit;
  
  /**
   * 借方科目类型	非必须	选项(1-总账、2-供应商、3-客户) ，当存在科目时，科目类型必填
   */
  private Byte debitAccountType;
  
  /**
   * 记账成本中心编码	非必须	“列账属性”为1必填
   */
  private String sapCostCenterCode;
  
  /**
   * 记账成本中心名称	非必须	“列账属性”为1必填
   */
  private String sapCostCenterName;
  
  /**
   * 利润中心编码	非必须	“列账属性”为2必填 可从SAP获取基础数据
   */
  private String profitsCenterCode;
  
  /**
   * 利润中心名称	非必须	“列账属性”为2必填
   */
  private String profitsCenterName;
  
  /**
   * 订单号
   */
  private String orderNo;
  
  /**
   * Wbs编号
   */
  private String wbsNo;
  
  /**
   * Wbs名称
   */
  private String wbsName;
  
  /**
   * 网络元素编号
   */
  private String networkElementCode;
  
  /**
   * 网络元素名称
   */
  private String networkElementName;
  
  /**
   * 修理费明细编码
   */
  private String fixFeeDetailCode;
  
  /**
   * 修理费明细名称
   */
  private String fixFeeDetailName;
  
  /**
   * 费用明细编码
   */
  private String chargeCode;
  
  /**
   * 费用明细名称
   */
  private String chargeName;
  
  /**
   *
   */
  private Integer count;
  
  /**
   *
   */
  private BigDecimal price;
  
  /**
   *
   */
  private String unit;
  
  /**
   * 专业类别
   */
  private String specialty;
  
  /**
   * 税种编码
   */
  private String taxFeeCode;
  
  /**
   * 税务期间
   */
  private String taxFeePeriod;
  
  /**
   * 客户编码
   */
  private String clientGroupCode;
  
  /**
   * 客户名称
   */
  private String clientGroupName;
  
  /**
   * 产品编码
   */
  private String productGroupCode;
  
  /**
   * 产品名称
   */
  private String productGroupName;
  
  /**
   * 低值易耗编码
   */
  private String bizFeeDetailCode;
  
  /**
   * 低值易耗名称
   */
  private String bizFeeDetailName;
  
  /**
   * 人员类别
   */
  private String staffTypeCode;
  
  /**
   * 借款人帐号
   */
  private String borrowPersonAccount;
  
  /**
   * 借款人名称
   */
  private String borrowPersonName;
  
  /**
   * 借款人电话
   */
  private String borrowPersonTel;
  
  /**
   * 当为借款业务时选填，不填系统根据用途推导 格式2014/12/2
   */
  private Date borrowPersonDate;
  
  /**
   * 借款人部门
   */
  private String deptName;
  
  /**
   * 默认CNY  枚举项：  CNY   HKD  JPY   USD 支持业务类型为借款、经济事项100414
   */
  private String currency;
  
  /**
   * 非必须	默认1 币种对应的汇率   支持业务类型为借款、经济事项100414
   */
  private BigDecimal exchangeRate;
  
  /**
   * 币种金额	非必须	默认和报账金额一样 币种对应的金额   支持业务类型为借款、经济事项100414
   */
  private BigDecimal currencySum;
  
  /**
   * 特殊总账标识
   */
  private String specialTag;
  
  /**
   * 备选统驭科目编码
   */
  private String preAccountCode;
  
  /**
   * 备选统驭科目名称
   */
  private String preAccountName;
  
  /**
   * 费用类型	非必须	即挂即付事项必须
   */
  private String feeType;
  
  /**
   * 支付类型	非必须	即挂即付事项必须
   */
  private String payType;
  
  /**
   * 付款条件	非必须	即挂即付事项必须
   */
  private String payCondition;
  
  /**
   * 款项名称	非必须	即挂即付事项必须
   */
  private String fundName;
  
  /**
   * 报账类型	非必须	即挂即付事项必须
   */
  private String cmdType;
  
  /**
   * 履约计划	非必须	即挂即付事项必须
   */
  private String bili;
  
  /**
   * 税金	非必须	即挂即付事项必须
   */
  private BigDecimal taxSum;
  
  /**
   * 不含税金额	非必须	即挂即付事项必须
   */
  private BigDecimal noTaxSum;
  
  /**
   * 发票金额	非必须	即挂即付事项必须
   */
  private BigDecimal invoiceSum;
  
  /**
   *
   */
  private String expectedpayDate;
  
  /**
   * 往来类型编码
   */
  private String contactDetailInfoCode;
  
  /**
   * 往来类型名称
   */
  private String contactDetailInfoName;
  
  /**
   * 摊销受益期-开始年月	非必须	格式为：YYYYMM
   */
  private String amortizeBeginDate;
  
  /**
   * 摊销受益期-结束年月	非必须	格式为：YYYYMM
   */
  private String amortizeEndDate;
  
  /**
   * 资产分类编码
   */
  private String assetsTypeCode;
  
  /**
   * 资产分类名称
   */
  private String assetsTypeName;
  
  /**
   * 开始日期	可选	yyyy-MM-dd
   */
  private String beginDate;
  
  /**
   * 结束日期	可选	yyyy-MM-dd
   */
  private String endDate;
  
  /**
   * 出发地省	可选	如：广东省
   */
  private String startProvince;
  
  /**
   * 出发地市	可选	如：广州市
   */
  private String startCity;
  
  /**
   * 出发县
   */
  private String startCountry;
  
  /**
   * 目的地省	可选	如：广东省
   */
  private String targetProvince;
  
  /**
   * 目的地市	可选	如：广州市
   */
  private String targetCity;
  
  /**
   * 目的县
   */
  private String targetCountry;
  
  /**
   * 出差人数
   */
  private Integer travellerAmount;
  
  /**
   * 交通工具编码 可选CL130 >飞机 CL1302 >火车 CL1303  >轮船  CL1309  >其他 CL1305 >公派汽车
   */
  private String majorVehicle;
  
  /**
   * 交通工具名称
   */
  private String majorVehicleName;
  
  /**
   * 交通工具编码(回)
   */
  private String majorVehicleBack;
  
  /**
   * 交通工具编码(回) 名称
   */
  private String majorVehicleBackName;
  
  /**
   * 市内交通费
   */
  private BigDecimal sundryCharge;
  
  /**
   * 住宿费（不含税）
   */
  private BigDecimal residenceFee;
  
  /**
   * 伙食补贴
   */
  private BigDecimal dieteticSubsidyFee;
  
  /**
   * 其他费用
   */
  private BigDecimal miscFee;
  
  /**
   * 城市间交通费
   */
  private BigDecimal transportationFee;
  
  /**
   * 出差类型编码	可选	CL0401 参加会议  CL0403 外出事访 CL0404 调研 CL0406 其它 CL0402 学习培训
   */
  private String type;
  
  /**
   * 进项税金额
   */
  private BigDecimal inputTaxSum;
  
  /**
   * 实物编号或卡片号
   */
  private String estateCode;
  
  /**
   * 实物名称
   */
  private String estateName;
  
  /**
   * 地点类别	可选	ZH0301营业网点 ZH0306主机托管机房  ZH0302交换母局机房  ZH0303接入网机房  ZH0305办公楼宇  ZH0398其他 ZH0304小灵通基站 ZH0307电话亭  ZH0399综合  ZH0308信息化小区机房 ZH0309 3G基站及机房
   */
  private String estateType;
  
  /**
   * 业务类型(房屋租赁费表单)	可选	02            C网 0002  非C网
   */
  private String cwebBizType;
  
  /**
   * 是否反记账	可选	1：是
   */
  private Byte isOppositeLedger;
  
  /**
   * 标的物
   */
  private String subjectMatter;
  
  /**
   * 实际出差天数
   */
  private Integer onWayDay;
  
  /**
   * 实际培训天数
   */
  private Integer trainingDay;
  
  /**
   * 是否出差	　	（1：是；0:否）
   */
  private Byte isTravel;
  
  /**
   * 培训费
   */
  private BigDecimal trainingCharge;
  
  /**
   * 开支事项	　	(1: 参加培训；2：主办培训)
   */
  private Byte expenditureItems;
  
  /**
   * 招待费标准(人均)
   */
  private BigDecimal hospitalityStandard;
  
  /**
   * 招待人数
   */
  private Integer hospitalityPeople;
  
  /**
   * 会议名称
   */
  private String meetingName;
  
  /**
   * 会议类别	　	  会议费表单专用(送编码)  HY0201全局性(一类) HY0202专业性(二类)  HY0203部门性(三类)  HY0204特殊性(四类)
   */
  private String meetingType;
  
  /**
   * 会议地点	　	  会议费表单专用
   */
  private String meetingLocation;
  
  /**
   * 会议范围	　	20190122新增 会议费表单专用(送编码)  HY0401 全国会议  HY0402 全省会议  HY0403 地市会议  HY0404 区县会议  HY0405 集团本部  HY0406 省本部 HY0407 市本部
   */
  private String meetingScope;
  
  /**
   * 主办部门	　	  会议费表单专用
   */
  private String inChargeDepartment;
  
  /**
   * 主办人	　	  会议费表单专用
   */
  private String inChargePerson;
  
  /**
   * 会议起始日 会议费表单专用 格式yyyy-MM-dd
   */
  private String meetingBeginDate;
  
  /**
   * 会议结束日	　	  会议费表单专用 格式yyyy-MM-dd
   */
  private String meetingEndDate;
  
  /**
   * 参会人数	　	  会议费表单专用
   */
  private Integer participantAmount;
  
  /**
   * 费用细项   会议费表单专用  HY1001 住宿费  HY1002 伙食费  HY1003 场租费  HY1098 其他费用
   */
  private String feeDetail;
  
  /**
   * 价款	　	  一单清专用
   */
  private BigDecimal priceSum;
  
  /**
   * (预计)还款日期	　	yyyy-MM-dd
   */
  private String expectedpayCleanDate;
  
  /**
   * 自购飞机票 机票+燃油	　	一单清专用或国内差旅员工
   */
  private BigDecimal aircraftSum;
  
  /**
   * 自购飞机票 机建+保险	　	一单清专用或国内差旅员工
   */
  private BigDecimal insuranceSum;
  
  /**
   * 自购火车票	　	一单清专用或国内差旅员工
   */
  private BigDecimal trainSum;
  
  /**
   * 实名车船票	　	一单清专用或国内差旅员工
   */
  private BigDecimal vehicleorshipSum;
  
  /**
   * 车辆使用耗油类型(车辆使用费表单)	可选	100 汽油 101 柴油 102 天然气
   */
  private Integer oilType;
  
  /**
   * 耗用类型（车辆使用费表单）	可选	NY6100   生产用油 NY6110  ---油机用油费  NY610002  ---维护车辆用油 NY610003  ---综合服务营销车辆用油 NY6200    ---非生产用油  NY620001  ---管理层公务车辆用油 自购飞机票电票	　	BigDecimal 	　	自购飞机票电票	　	一单清专用或国内差旅员工
   */
  private String utype;
  
  /**
   * 自购飞机票电票	　	一单清专用或国内差旅员工
   */
  private BigDecimal ticketElectronicSum;
  
  /**
   * 子单对应原单号	非必填	  子单对应原单号 （进项税转出集成报账用）
   */
  private String detailOriginalWriteoffCode;
  
  /**
   * 报账单id
   */
  private String witeoffInstanceId;
  
  @TableField(exist = false)
  private static final long serialVersionUID = 1L;
  
  
  public TWiteoffInstanceSubitem(WiteoffSubitemData witeoffInstanceSubitem, String witeoffInstanceId) {
    BeanUtils.copyProperties(witeoffInstanceSubitem, this);
    this.witeoffInstanceId = witeoffInstanceId;
    this.detail = witeoffInstanceSubitem.getDesc();
  }
  
  public static List<TWiteoffInstanceSubitem> toList(List<WiteoffSubitemData> witeoffSubitemData, String otherSystemMainId) {
    if (CollectionUtils.isEmpty(witeoffSubitemData)) {
      return null;
    }
    List<TWiteoffInstanceSubitem> TWiteoffInstanceSubitems = new ArrayList<>();
    for (WiteoffSubitemData WiteoffInstanceSubitem : witeoffSubitemData) {
      TWiteoffInstanceSubitem TWiteoffInstanceSubitem = new TWiteoffInstanceSubitem(WiteoffInstanceSubitem, otherSystemMainId);
      TWiteoffInstanceSubitems.add(TWiteoffInstanceSubitem);
    }
    return TWiteoffInstanceSubitems;
  }
  
  public TWiteoffInstanceSubitem(MedicineOnJobOrRetireSubitem subitemBase, String witeoffInstanceId) {
    BeanUtils.copyProperties(subitemBase, this);
    this.witeoffInstanceId = witeoffInstanceId;
  
    this.detail = subitemBase.getDesc();
  }
  
  public static List<TWiteoffInstanceSubitem> toSubItemsList(List<MedicineOnJobOrRetireSubitem> subitemBaseList, String otherSystemMainId) {
    if (CollectionUtils.isEmpty(subitemBaseList)) {
      return null;
    }
    List<TWiteoffInstanceSubitem> TWiteoffInstanceSubitems = new ArrayList<>();
    for (MedicineOnJobOrRetireSubitem subitemBase : subitemBaseList) {
      TWiteoffInstanceSubitem TWiteoffInstanceSubitem = new TWiteoffInstanceSubitem(subitemBase, otherSystemMainId);
      TWiteoffInstanceSubitems.add(TWiteoffInstanceSubitem);
    }
    return TWiteoffInstanceSubitems;
  }
  
}